package study08;

abstract class Animal {
    private String name;
    public Animal(String name) {
        this.name = name;
    }
    public abstract void shout();
    public abstract void eat(Food food);
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}
/*
1.定义了 Dog 类，并继承了 Animal 类;
2.在 Dog 类中定义类构造方法并在构造方法中调用了父类的构造方法;
3.重写了父类 Animal 动物发声的抽象方法 shout()和动物吃饭的抽象方法 eat()。
*/
class Dog extends Animal {
    public Dog(String name) {
        super(name);

    }
    @Override
    public void shout() {
        System.out.print ("小狗汪汪汪~~~");
    }
    @Override
    public void eat(Food food) {
        System.out.println(getName() + "正在啃着香喷喷的" +
                food.getName()+"!");
    }
}
/*
1.定义了 Cat 类，并继承了 Animal 类;
2.在 Cat 类中定义类构造方法并在构造方法中调用了父类的构造方法;
3.重写了父类 Animal 动物发声的抽象方法 shout()和动物吃饭的抽象方法 eat()。
*/
class Cat extends Animal{
    public Cat(String name) {
        super(name);
    }
    public void shout() {
        System.out.print("小猫喵喵喵~~~");
    }
    public void eat(Food food) {
        System.out.println(getName() + "正在吃着香喷喷的 "+food.getName()+"!");
    }
}
//定义了一个 Food 接口，在接口中编写了一个抽象方法 getName()。
interface Food{
    public abstract String getName();
}
//定义了一个 Bone类并实现了 Food接口，在Bone类中实现了Food接口的getName()

class Bone implements Food{
    @Override
    public String getName() {
        return "骨头";
    }
}

/*
1.定义了一个 Fish 类，Fish 类继承了 Animal 类并实现了 Food 接口;
2.在 Fish 类中定义了构造方法并在构造方法中调用了父类 Food 的构造方法；
3.继承了 Animal 类的 shout()方法和 eat()方法。
*/
class Fish extends Animal implements Food{
    public Fish(String name) {
        super(name);
    }
    @Override
    public void shout() {
    }
    @Override
    public void eat(Food food) {
    }
}
/*
1.定义了一个 Feader 类，Feader 类中声明了饲养员名称 name 并提供了 name 属性的
getter 和 setter 方法；
2.定义了构造方法；
3.编写了饲养员说话的 speak()方法和饲养动物的 feed()方法。
*/
class Feeder {
    private String name;
    public Feeder(String name) {
        this.name = name;
    }
    public void speak() {
        System.out.println("欢迎来到动物园！");
        System.out.println("------------------");
        System.out.println("我是饲养员： "+getName());
    }
    public void feed(Animal a, Food food) {
        a.eat(food);
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}


//定义了一个测试类 DongWuTes
public class DongWuTest {
    public static void main(String[] args) {
        Feeder feeder = new Feeder("小华");
        feeder.speak();
        Dog dog = new Dog("小狗");
        dog.shout();
        Food food = new Bone();
        feeder.feed(dog, food);
        Cat cat = new Cat("小猫");
        cat.shout();
        food = new Fish("黄花鱼");
        feeder.feed(cat, food);
    }
}